package com.uuah.server.config.spring.parsers.processors;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;

import com.uuah.server.config.spring.parsers.PreProcessor;
import com.uuah.server.config.spring.parsers.assembly.configuration.IPropertyConfiguration;
import com.uuah.server.util.spring.SpringXMLUtils;

/**
 * Throws an exception if any of the disallowed attributes (after translation)
 * is present. Designed to cooperates with
 * {@link com.uuah.server.config.spring.parsers.delegate.AbstractSerialDelegatingDefinitionParser#addHandledException(Class)}
 */
public class BlockAttribute implements PreProcessor {

	private Set disallowed;

	public BlockAttribute(String disallowed) {
		this(new String[] { disallowed });
	}

	public BlockAttribute(String[] disallowed) {
		this.disallowed = new HashSet(Arrays.asList(disallowed));
	}

	public void preProcess(IPropertyConfiguration config, Element element) {
		NamedNodeMap attributes = element.getAttributes();
		for (int i = 0; i < attributes.getLength(); i++) {
			String alias = SpringXMLUtils.attributeName((Attr) attributes
					.item(i));
			String name = config.translateName(alias);
			if (disallowed.contains(name)) {
				throw new BlockAttributeException("Attribute " + alias
						+ " is not allowed here.");
			}
		}
	}

	public static class BlockAttributeException extends IllegalStateException {

		private BlockAttributeException(String message) {
			super(message);
		}

	}

}
